home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / graphics / vlapak1.zip / MXFONT.ZIP / MODEX.INC < prev    next >
Text File  |  1993-06-23  |  18KB  |  622 lines

  1. LABEL X320Y200 word 
  2.     db      00      ; 0e3h    ; dot clock
  3.     db      02      ; Number of CRTC Registers to update
  4.     dw      00014h  ; turn off dword mode
  5.     dw      0e317h  ; turn on byte mode
  6.     dw      320     ; width
  7.     dw      200     ; height
  8.  
  9. LABEL X320Y240 word
  10.     db      0e3h    ; dot clock
  11.     db      10      ; Number of CRTC Registers to update
  12.     dw      00d06h  ; vertical total
  13.     dw      03e07h  ; overflow (bit 8 of vertical counts)
  14.     dw      04109h  ; cell height (2 to double-scan)
  15.     dw      0ea10h  ; v sync start
  16.     dw      0ac11h  ; v sync end and protect cr0-cr7
  17.     dw      0df12h  ; vertical displayed
  18.     dw      00014h  ; turn off dword mode
  19.     dw      0e715h  ; v blank start
  20.     dw      00616h  ; v blank end
  21.     dw      0e317h  ; turn on byte mode
  22.     dw      320     ; width
  23.     dw      240     ; height
  24.  
  25. LABEL X360Y200 word
  26.     db      0e7h    ; dot clock
  27.     db      08      ; Number of CRTC Registers to update
  28.     dw      06b00h  ; horz total
  29.     dw      05901h  ; horz displayed
  30.     dw      05a02h  ; start horz blanking
  31.     dw      08e03h  ; end horz blanking
  32.     dw      05e04h  ; start h sync
  33.     dw      08a05h  ; end h sync
  34.     dw      00014h  ; turn off dword mode
  35.     dw      0e317h  ; turn on byte mode
  36.     dw      360     ; width
  37.     dw      200     ; height
  38.  
  39. LABEL X360Y240 word
  40.     db      0e7h    ; dot clock
  41.     db      16      ; Number of CRTC Registers to update
  42.     dw      06b00h  ; horz total
  43.     dw      05901h  ; horz displayed
  44.     dw      05a02h  ; start horz blanking
  45.     dw      08e03h  ; end horz blanking
  46.     dw      05e04h  ; start h sync
  47.     dw      08a05h  ; end h sync
  48.     dw      00d06h  ; vertical total
  49.     dw      03e07h  ; overflow (bit 8 of vertical counts)
  50.     dw      04109h  ; cell height (2 to double-scan)
  51.     dw      0ea10h  ; v sync start
  52.     dw      0ac11h  ; v sync end and protect cr0-cr7
  53.     dw      0df12h  ; vertical displayed
  54.     dw      00014h  ; turn off dword mode
  55.     dw      0e715h  ; v blank start
  56.     dw      00616h  ; v blank end
  57.     dw      0e317h  ; turn on byte mode
  58.     dw      360
  59.     dw      240
  60.  
  61. LABEL X376Y282 word
  62.     db      0e7h
  63.     db      18
  64.     dw      06e00h  ; horz total
  65.     dw      05d01h  ; horz displayed
  66.     dw      05e02h  ; start horz blanking
  67.     dw      09103h  ; end horz blanking
  68.     dw      06204h  ; start h sync
  69.     dw      08f05h  ; end h sync
  70.     dw      06206h  ; vertical total
  71.     dw      0f007h  ; overflow
  72.     dw      06109h  ; cell height
  73.     dw      0310fh  ;
  74.     dw      03710h  ; v sync start
  75.     dw      08911h  ; v sync end and protect cr0-cr7
  76.     dw      03312h  ; vertical displayed
  77.     dw      02f13h  ; offset
  78.     dw      00014h  ; turn off dword mode
  79.     dw      03c15h  ; v blank start
  80.     dw      05c16h  ; v blank end
  81.     dw      0e317h  ; turn on byte mode
  82.     dw      376
  83.     dw      564
  84.  
  85. LABEL X320Y400 word
  86.     db      00      ;0e3h    ; dot clock
  87.     db      03      ; Number of CRTC Registers to update
  88.     dw      04009h  ; cell height
  89.     dw      00014h  ; turn off dword mode
  90.     dw      0e317h  ; turn on byte mode
  91.     dw      320     ; width
  92.     dw      400     ; height
  93.  
  94. LABEL X320Y480 word
  95.     db      0e3h    ; dotclock
  96.     db      10      ; Number of CRTC Registers to update
  97.     dw      00d06h  ; vertical total
  98.     dw      03e07h  ; overflow (bit 8 of vertical counts)
  99.     dw      04009h  ; cell height (2 to double-scan)
  100.     dw      0ea10h  ; v sync start
  101.     dw      0ac11h  ; v sync end and protect cr0-cr7
  102.     dw      0df12h  ; vertical displayed
  103.     dw      00014h  ; turn off dword mode
  104.     dw      0e715h  ; v blank start
  105.     dw      00616h  ; v blank end
  106.     dw      0e317h  ; turn on byte mode
  107.     dw      320     ; width
  108.     dw      480     ; height
  109.  
  110. LABEL X360Y400 word
  111.     db      0e7h    ; dot clock
  112.     db      09      ; Number of CRTC Registers to update
  113.     dw      06b00h  ; horz total
  114.     dw      05901h  ; horz displayed
  115.     dw      05a02h  ; start horz blanking
  116.     dw      08e03h  ; end horz blanking
  117.     dw      05e04h  ; start h sync
  118.     dw      08a05h  ; end h sync
  119.     dw      04009h  ; cell height
  120.     dw      00014h  ; turn off dword mode
  121.     dw      0e317h  ; turn on byte mode
  122.     dw      360     ; width
  123.     dw      400     ; height
  124.  
  125.  
  126. LABEL X360Y480 word
  127.     db      0e7h
  128.     db      17
  129.     dw      06b00h  ; horz total
  130.     dw      05901h  ; horz displayed
  131.     dw      05a02h  ; start horz blanking
  132.     dw      08e03h  ; end horz blanking
  133.     dw      05e04h  ; start h sync
  134.     dw      08a05h  ; end h sync
  135.     dw      00d06h  ; vertical total
  136.     dw      03e07h  ; overflow
  137.     dw      04009h  ; cell height
  138.     dw      0ea10h  ; v sync start
  139.     dw      0ac11h  ; v sync end and protect cr0-cr7
  140.     dw      0df12h  ; vertical displayed
  141.     dw      02d13h  ; offset
  142.     dw      00014h  ; turn off dword mode
  143.     dw      0e715h  ; v blank start
  144.     dw      00616h  ; v blank end
  145.     dw      0e317h  ; turn on byte mode
  146.     dw      360
  147.     dw      480
  148.  
  149. LABEL X360Y360 word
  150.     db      0e7h
  151.     db      15
  152.     dw      06b00h  ; horz total
  153.     dw      05901h  ; horz displayed
  154.     dw      05a02h  ; start horz blanking
  155.     dw      08e03h  ; end horz blanking
  156.     dw      05e04h  ; start h sync
  157.     dw      08a05h  ; end h sync
  158.     dw      04009h  ; cell height
  159.     dw      08810h  ; v sync start
  160.     dw      08511h  ; v sync end and protect cr0-cr7
  161.     dw      06712h  ; vertical displayed
  162.     dw      02d13h  ; offset
  163.     dw      00014h  ; turn off dword mode
  164.     dw      06d15h  ; v blank start
  165.     dw      0ba16h  ; v blank end
  166.     dw      0e317h  ; turn on byte mode
  167.     dw      360
  168.     dw      360
  169.  
  170. LABEL X376Y308 word
  171.     db      0e7h
  172.     db      18
  173.     dw      06e00h  ; horz total
  174.     dw      05d01h  ; horz displayed
  175.     dw      05e02h  ; start horz blanking
  176.     dw      09103h  ; end horz blanking
  177.     dw      06204h  ; start h sync
  178.     dw      08f05h  ; end h sync
  179.     dw      06206h  ; vertical total
  180.     dw      00f07h  ; overflow
  181.     dw      04009h  ;
  182.     dw      0310fh  ;
  183.     dw      03710h  ; v sync start
  184.     dw      08911h  ; v sync end and protect cr0-cr7
  185.     dw      03312h  ; vertical displayed
  186.     dw      02f13h  ; offset
  187.     dw      00014h  ; turn off dword mode
  188.     dw      03c15h  ; v blank start
  189.     dw      05c16h  ; v blank end
  190.     dw      0e317h  ; turn on byte mode
  191.     dw      376
  192.     dw      308
  193.  
  194. LABEL X376Y564 word
  195.     db      0e7h
  196.     db      18
  197.     dw      06e00h  ; horz total
  198.     dw      05d01h  ; horz displayed
  199.     dw      05e02h  ; start horz blanking
  200.     dw      09103h  ; end horz blanking
  201.     dw      06204h  ; start h sync
  202.     dw      08f05h  ; end h sync
  203.     dw      06206h  ; vertical total
  204.     dw      0f007h  ; overflow
  205.     dw      06009h  ;
  206.     dw      0310fh  ;
  207.     dw      03710h  ; v sync start
  208.     dw      08911h  ; v sync end and protect cr0-cr7
  209.     dw      03312h  ; vertical displayed
  210.     dw      02f13h  ; offset
  211.     dw      00014h  ; turn off dword mode
  212.     dw      03c15h  ; v blank start
  213.     dw      05c16h  ; v blank end
  214.     dw      0e317h  ; turn on byte mode
  215.     dw      376
  216.     dw      564
  217.  
  218. LABEL X256Y240 word
  219.     db      0e3h    ; dot clock
  220.     db      16      ; Number of CRTC Registers to update
  221.     dw      05f00h  ; horz total
  222.     dw      03f01h  ; horz displayed
  223.     dw      04202h  ; start horz blanking
  224.     dw      09f03h  ; end horz blanking
  225.     dw      04c04h  ; start h sync
  226.     dw      00005h  ; end h sync
  227.     dw      00d06h  ; vertical total
  228.     dw      03e07h  ; overflow (bit 8 of vertical counts)
  229.     dw      04109h  ; cell height (2 to double-scan)
  230.     dw      0ea10h  ; v sync start
  231.     dw      0ac11h  ; v sync end and protect cr0-cr7
  232.     dw      0df12h  ; vertical displayed
  233.     dw      00014h  ; turn off dword mode
  234.     dw      0e715h  ; v blank start
  235.     dw      00616h  ; v blank end
  236.     dw      0e317h  ; turn on byte mode
  237.     dw      256
  238.     dw      240
  239.     
  240. LABEL X256Y200 word
  241.     db      0e3h    ; dot clock
  242.     db      8       ; Number of CRTC Registers to update
  243.     dw      05f00h  ; horz total
  244.     dw      03f01h  ; horz displayed
  245.     dw      04202h  ; start horz blanking
  246.     dw      09f03h  ; end horz blanking
  247.     dw      04c04h  ; start h sync
  248.     dw      00005h  ; end h sync
  249.     dw      00014h  ; turn off dword mode
  250.     dw      0e317h  ; turn on byte mode
  251.     dw      256
  252.     dw      200
  253.  
  254. LAST_X_MODE         =     13
  255.  
  256. LABEL ModeTable word    ; Mode X tweak table
  257.     dw      offset X320Y200
  258.     dw      offset X320Y240
  259.     dw      offset X360Y200
  260.     dw      offset X360Y240
  261.     dw      offset X376Y282
  262.     dw      offset X320Y400
  263.     dw      offset X320Y480
  264.     dw      offset X360Y400
  265.     dw      offset X360Y480
  266.     dw      offset X360Y360
  267.     dw      offset X376Y308
  268.     dw      offset X376Y564
  269.     dw      offset X256Y240
  270.     dw      offset x256y200
  271.     
  272. M320x200x256 =0     ;constants for easy calling
  273. M320x240x256 =1
  274. M360x200x256 =2
  275. M360x240x256 =3
  276. M376x282x256 =4
  277. M320x400x256 =5
  278. M320x480x256 =6
  279. M360x400x256 =7
  280. M360x480x256 =8
  281. M360x360x256 =9
  282. M376x308x256 =10
  283. M376x564x256 =11
  284. M256x240x256 =12    ;GREAT modes - ypos is upper byte, xpos is lower
  285. M256x200x256 =13
  286.  
  287. InputStatus1=   3dah
  288. MISC_OUTPUT =   3c2h
  289. SC_Index    =   3c4h
  290. CRTC_Index  =   3d4h
  291. Graph_Index =   3ceh
  292. Attr_Index  =   3c0h    ;don't forget to clear flipflop & set bit 5 on index
  293. PEL_Write   =   3c8h
  294. PEL_Read    =   3c7h
  295. PEL_Data    =   3c9h
  296.  
  297. VGASeg      dw  0a000h
  298. ModeXWidth  dw  0
  299. ModeXHeight dw  0
  300. ModeXLogWidth dw 0
  301.  
  302. ;-----------------------------------------------------------------------
  303. ;
  304. ;   Sets mode # in AX, returns ax=0 if successful, ax=-1 if failed
  305. ;   cx= width of screen 
  306. ;
  307. ; SetModeX Adapted for VLA by Draeden,
  308. ; Originally written by Themie Gouthas,
  309. ; who adapted parts from M. Abrash code.
  310. ; (Talk about code reuse!)
  311. ;------------------------------------------------------------------------
  312. _Mode   dw  0
  313. _Scrw   dw  0
  314.  
  315. MACRO @SetModeX DaMode,DaWidth
  316.     mov     ax,DaMode
  317.     mov     cx,DaWidth
  318.     call    _Set_X_Mode
  319. ENDM @SetModeX
  320.  
  321. PROC _Set_X_Mode NEAR
  322.     pusha
  323.     push    es ds
  324.  
  325.     cld
  326.     mov     bx,cs
  327.     mov     ds,bx
  328.     mov     es,bx
  329.  
  330.     cmp     ax,LAST_X_MODE      ; have we selected a valid mode?
  331.     jle     @@ValidMode         ; Yes !
  332.  
  333.     pop     ds es
  334.     popa
  335.     mov     ax,-1               ; idiot.
  336.     ret
  337.  
  338. @@ValidMode:
  339.     mov     [_Mode],ax
  340.     mov     [_Scrw],cx
  341.  
  342.     mov     ax,13h              ; let the BIOS set standard 256-color
  343.     int     10h                 ;  mode (320x200 linear)
  344.     
  345.     mov     dx,SC_INDEX
  346.     mov     ax,0604h
  347.     out     dx,ax               ; disable chain4 mode
  348.     mov     ax,0100h
  349.     out     dx,ax               ; synchronous reset while setting Misc
  350.                                 ;  Output for safety, even though clock
  351.                                 ;  unchanged
  352.     mov     bx,[_Mode]
  353.     add     bx,bx
  354.     mov     si,[bx + ModeTable]
  355.     lodsb
  356.  
  357.     or      al,al
  358.     jz      @@DontSetDot
  359.     mov     dx,MISC_OUTPUT
  360.     out     dx,al               ; select the dot clock and Horiz
  361.                                 ;  scanning rate
  362. @@DontSetDot:
  363.     mov     dx,SC_INDEX
  364.     mov     ax,0300h
  365.     out     dx,ax               ; undo reset (restart sequencer)
  366.  
  367.     mov     dx,CRTC_INDEX       ; reprogram the CRT Controller
  368.     mov     al,11h              ; VSync End reg contains register write
  369.     out     dx,al               ; protect bit
  370.     inc     dx                  ; CRT Controller Data register
  371.     in      al,dx               ; get current VSync End register setting
  372.     and     al,07fh             ; remove write protect on various
  373.     out     dx,al               ; CRTC registers
  374.     dec     dx                  ; CRT Controller Index
  375.     cld
  376.     xor     cx,cx
  377.     lodsb
  378.     mov     cl,al
  379.  
  380. @@SetCRTParmsLoop:
  381.     lodsw                       ; get the next CRT Index/Data pair
  382.     out     dx,ax               ; set the next CRT Index/Data pair
  383.     dec     cx
  384.     jne     @@SetCRTParmsLoop
  385.  
  386.     lodsw
  387.     mov     [cs:ModeXWidth],ax
  388.     lodsw
  389.     mov     [cs:ModeXHeight],ax
  390.  
  391.     mov     dx,SC_INDEX
  392.     mov     ax,0f02h
  393.     out     dx,ax               ; enable writes to all four planes
  394.  
  395.                                 ; now clear all display memory, 8 pixels
  396.     mov     es,[cs:VGAseg]      ; at a time
  397.     sub     di,di               ; point ES:DI to display memory
  398.     sub     ax,ax               ; clear to zero-value pixels
  399.     mov     cx,8000h            ; # of words in display memory
  400.     rep     stosw               ; clear all of display memory
  401.     
  402.     ;  Mode X is set, now set the required logical page width.
  403.  
  404.     mov     cx,[cs:_Scrw]
  405.     shr     cx,2
  406.     mov     [cs:ModeXLogWidth],cx
  407.     shr     cx,1            ;divide by 8
  408.     mov     dx,CRTC_INDEX
  409.     mov     al,13h
  410.     mov     ah,cl
  411.     out     dx,ax
  412.  
  413.     pop     ds es
  414.     popa
  415.     xor     ax,ax
  416.     ret
  417. ENDP _Set_X_Mode
  418.  
  419. ────────────────────────────────────────────────────────────────────────────
  420. ;*   MISC planar mode routines
  421. ────────────────────────────────────────────────────────────────────────────
  422.  
  423.     ;ah: 0000b : bit 0= plane 0, bit 1=plane 1, etc..
  424.     ;
  425.     ;DESTROYS: al, dx
  426.     ;
  427. MACRO  @Set_Write_Plane
  428.     mov     dx,SC_Index
  429.     mov     al,2
  430.     and     ah,1111b
  431.     out     dx,ax
  432. ENDM   @Set_Write_Plane
  433.  
  434.     ;ah: plane to latch for read (0-3)
  435.     ;
  436.     ;DESTROYS: al, dx
  437.     ;
  438. MACRO  @Set_Read_Plane
  439.     mov     dx,Graph_Index
  440.     mov     al,4
  441.     out     dx,ax
  442. ENDM   @Set_Read_Plane
  443.  
  444.     ;ah: write mode (0-3)
  445.     ;
  446.     ;DESTROYS: ax, dx
  447.     ;
  448. MACRO @Set_Write_Mode
  449.     mov     dx,Graph_Index
  450.     mov     al,5
  451.     out     dx,al
  452.     inc     dx
  453.     in      al,dx
  454.     and     al,11111100b    ;clear out write mode bits
  455.     and     ah,00000011b
  456.     or      al,ah
  457.     out     dx,al
  458. ENDM  @Set_Write_Mode
  459.  
  460.     ;ah: Read mode (0-1)
  461.     ;
  462.     ;DESTROYS: ax, dx
  463.     ;
  464. MACRO @Set_Read_Mode
  465.     mov     dx,Graph_Index
  466.     mov     al,5
  467.     out     dx,al
  468.     inc     dx
  469.     in      al,dx
  470.     and     al,11110111b    ;clear out write mode bits
  471.     shl     ah,3            ;move bit to correct position
  472.     and     ah,00001000b
  473.     or      al,ah
  474.     out     dx,al
  475. ENDM  @Set_Read_Mode
  476.  
  477.     ;bx: starting offset
  478.     ;
  479.     ;DESTROYS: ax, dx
  480.     ;
  481. MACRO @Set_Start_Offset
  482.     mov     dx,CRTC_Index
  483.     mov     al,0ch
  484.     mov     ah,bh       ;write the HIGH byte
  485.     out     dx,ax
  486.     inc     al
  487.     mov     ah,bl       ;write the LOW byte
  488.     out     dx,ax
  489. ENDM  @Set_Start_Offset
  490.  
  491.     ;ah = pelpan value
  492.     ;
  493.     ;DESTROYS: ax, dx
  494.     ;
  495. MACRO @Set_HPP
  496.     mov     dx,InputStatus1
  497.     in      al,dx           ;dummy input
  498.     mov     dx,Attr_Index
  499.     mov     al,33h
  500.     out     dx,al
  501.     mov     al,ah
  502.     out     dx,al
  503. ENDM
  504.     
  505.     ;DESTROYS: ax, dx   - sets pixel pan compatibility
  506.     ;
  507. MACRO @Set_PPC
  508.     mov     dx,InputStatus1
  509.     in      al,dx           ;dummy input
  510.     mov     dx,Attr_Index
  511.     mov     al,30h
  512.     out     dx,al
  513.     inc     dx
  514.     in      al,dx
  515.     dec     dx
  516.     or      al,00100000b
  517.     out     dx,al
  518. ENDM
  519.  
  520.     ;bx: scanline to set split screen at
  521.     ;
  522.     ;DESTROYS: ax, dx
  523.     ;
  524. MACRO @Set_Split
  525.     mov     al,18h
  526.     mov     ah,bl
  527.     mov     dx,CRTC_Index
  528.     out     dx,ax       ;set bits 0-7
  529.  
  530.     mov     al,09h
  531.     out     dx,al
  532.     inc     dx
  533.     in      al,dx
  534.     mov     ah,bh
  535.     and     ah,00000010b
  536.     shl     ah,5
  537.     and     al,10111111b
  538.     or      al,ah
  539.     out     dx,al       ;set bit 9
  540.  
  541.     dec     dx
  542.     mov     al,07h
  543.     out     dx,al
  544.     inc     dx
  545.     in      al,dx
  546.     and     al,11101111b
  547.     mov     ah,bh
  548.     and     ah,00000001b
  549.     shl     ah,4
  550.     or      al,ah
  551.     out     dx,al       ;set bit 8
  552. ENDM @Set_SPlit
  553.  
  554. MACRO @FullVertWait
  555.  LOCAL @@Vr, @@Nvr
  556.     mov     dx,InputStatus1
  557. @@Vr:
  558.     in      al,dx
  559.     test    al,8
  560.     jz      @@Vr                    ;wait until Verticle Retrace starts
  561. @@Nvr:
  562.     in      al,dx
  563.     test    al,8
  564.     jnz     @@Nvr                   ;wait until Verticle Retrace Ends
  565. ENDM @FullVertWait
  566.  
  567. MACRO @WaitVert
  568.  LOCAL @@Vr
  569.     mov     dx,InputStatus1
  570. @@VR:
  571.     in      al,dx
  572.     test    al,8
  573.     jz      @@VR                    ;wait until Verticle Retrace starts
  574. ENDM  @WaitVert
  575.  
  576. MACRO @WaitVertEnd
  577.   LOCAL @@NVr
  578.     mov     dx,InputStatus1
  579. @@NVR:
  580.     in      al,dx
  581.     test    al,8
  582.     jnz     @@NVR                   ;wait until Verticle Retrace Ends
  583. ENDM  @WaitVertEnd
  584.     
  585.     ;si = offset to palette
  586.     ;cx = number of colors to write
  587.     ;al = starting palette register
  588.     ;
  589.     ;DESTROYS: dx,si,cx
  590.     ;
  591. MACRO @WritePalette
  592.     mov     dx,cx
  593.     add     cx,cx
  594.     add     cx,dx
  595.     mov     dx,03c8h
  596.     out     dx,al
  597.     inc     dx
  598.     cld
  599.     rep outsb
  600. ENDM @WritePalette
  601.     
  602.     ;cx = Number of Horizontal retraces to wait
  603.     ;   NOTE: this may wait too many on a slow machine upto 2x
  604.     ;
  605.     ;DESTORYS: cx, al, dx
  606.     ;
  607. MACRO @WaitHRs
  608.  LOCAL @@WaitForHR, @@WaitForHRend
  609.     mov     dx,InputStatus1
  610. @@WaitferHR:
  611.     in      al,dx
  612.     and     al,1001b
  613.     dec     al
  614.     jne     @@WaitFerHR
  615. @@WaitForHRend:
  616.     in      al,dx
  617.     and     al,1001b
  618.     jne     @@WAitForHRend
  619.     dec     cx
  620.     jne     @@WaitferHR
  621. ENDM
  622.